package util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List;

public final class JdbcTemplate {

	/****
	 * 利用JDBC执行CUD操作的模板方法
	 * @return
	 */
	// public final int update(StatementCreator sc, String sql) {
	// 	try(Connection conn = ConnectionFactory.getConnection();) {
	// 		//1. 创建Statement, 可是我不知道怎么创建
	// 		Statement stmt = sc.createStatement(conn);
	// 		//2. 执行
	// 		return stmt.executeUpdate(sql);
	// 	} catch (Exception e) {
	// 		e.printStackTrace();
	// 	}
	// 	//
	// 	return -1;
	// }
	
	public final int update(PreparedStatementCreator psc) {
		try(Connection conn = ConnectionFactory.getConnection()) {
			//1. 创建Statement, 可是我不知道怎么创建
			PreparedStatement pstmt = psc.preparedStatement(conn);
			//2. 执行
			return pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		//
		return -1;
	}
	/****
	 * 利用JDBC执行SELECT操作的模板方法
	 * @return
	 */
	public final <T> T queryOne(PreparedStatementCreator psc, ResultSetExtractor<T> rse) {
		List<T> result = queryList(psc, rse);
		if(result != null && result.size() > 0) {
			return queryList(psc, rse).get(0);
		}
		//
		return null;
	}
	
	public final <T> List<T> queryList(PreparedStatementCreator psc, ResultSetExtractor<T> rse) {
		try(Connection conn = ConnectionFactory.getConnection();) {
			//1. 创建Statement, 可是我不知道怎么创建
			PreparedStatement pstmt = psc.preparedStatement(conn);
			//2. 执行
			ResultSet rs = pstmt.executeQuery();
			//3. 处理结果集【可是我不知道怎么处理，谁调用我谁知道】
			return rse.handler(rs);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
